# -*- coding: utf-8 -*-
# 设置文件编码格式为utf-8

import random
# 导入random模块，用于生成随机数
from cocos.actions import MoveTo, CallFuncS
# 从cocos.actions模块中导入MoveTo和CallFuncS动作
from cocos.sprite import Sprite
# 从cocos.sprite模块中导入Sprite类

import define
# 导入名为define的模块，其中包含了一些常量的定义----------HAO

def kill(spr):
    # 定义一个名为kill的函数，接受一个参数spr
    spr.unschedule(spr.update)
    # 取消对spr的update方法的定时调度
    arena = spr.parent.parent
    # 获取spr所在的游戏场景
    if not spr.is_big:
        # 如果spr不是大圆点
        arena.batch.add(Dot())
        # 在场景中添加一个新的小圆点
        spr.killer.add_score()
        # 对吃小圆点者的分数进行加一操作
    else:
        # 如果spr是大圆点
        spr.killer.add_score(2)
        # 对吃大圆点者的分数进行加二操作
    arena.batch.remove(spr)
    # 从场景中移除spr，吃完了----------------------HAO.2023.12.6
    if not spr.killer.is_enemy:
        # 如果吃豆豆者不是敌人（即玩家自己）
        arena.parent.update_score()
        # 更新游戏场景的分数显示
    del spr
    # 删除spr对象

class Dot(Sprite):
    # 定义一个名为Dot的类，继承自Sprite类，就是我们的豆豆
    def __init__(self, pos=None, color=None):
        # 定义初始化方法，接受两个可选参数pos和color
        if color is None:
            # 如果color参数未提供
            color = random.choice(define.ALL_COLOR)
            # 从define模块中的ALL_COLOR列表中随机选择一种颜色

        super(Dot, self).__init__('circle.png', color=color)
        # 调用父类的初始化方法，传入图片文件名和颜色参数
        self.killed = False
        # 设置killed属性为False，表示未被吃掉
        if pos is None:
            # 如果pos参数未提供
            self.position = (random.randint(40, define.WIDTH - 40),
                             random.randint(40, define.HEIGHT - 40))
            # 在随机位置生成小圆点
            self.is_big = False
            # 设置is_big属性为False，表示小圆点
            self.scale = 0.8
            # 设置缩放比例为0.8
        else:
            # 如果pos参数提供了位置信息
            self.position = (pos[0] + random.random() * 32 - 16,
                             pos[1] + random.random() * 32 - 16)
            # 在指定位置周围随机生成大圆点,这个在蛇死亡的时候用
            self.is_big = True
            # 设置is_big属性为True，表示大圆点
        self.schedule_interval(self.update, random.random() * 0.2 + 0.1)
        # 定时调用update方法，时间间隔为0.1~0.3秒之间的随机值,进行自主更新

    def update(self, dt):
        # 定义update方法，接受一个参数dt（时间间隔）
        arena = self.parent.parent
        # 获取所在的游戏场景
        snake = arena.snake
        # 获取场景中的蛇对象
        self.check_kill(snake)
        # 调用check_kill方法，检查豆豆自己是否被蛇吃掉
        for s in arena.enemies:
            # 遍历场景中的敌人对象列表
            self.check_kill(s)
            # 调用check_kill方法，检查豆豆自己是否被敌人吃掉

    def check_kill(self, snake):
        # 定义check_kill方法，接受一个参数snake（蛇对象）
        if (not self.killed and not snake.is_dead) and (
            abs(snake.x - self.x) < 32 and abs(snake.y - self.y) < 32
        ):
            # 如果self未被吃掉且蛇未死亡，并且蛇与self的距离在32以内
            self.killed = True
            # 将self的killed属性设置为True，表示豆豆被吃掉
            self.killer = snake
            # 将self的killer属性设置为蛇对象，是你吃了我。。。。。。。。。。HAO
            self.do(MoveTo(snake.position, 0.1) + CallFuncS(kill))
            # 执行MoveTo动作，将self移动到蛇的位置，并在0.1秒后执行kill函数